<?php
	/* clase abstracta para el LINK con MySQL (solo Link) */
	abstract class MySQLLink extends MyDebuger implements Conexion {
		/* usuario						*/
		protected $userMySql	= '';
		/* contrasena					*/
		protected $passMySql	= '';
		/* host, por defecto localhost	*/
		protected $hostMySql	= '';
		/* Nombre de la base de datos	*/
		protected $ddbbMySql	= '';
		/* Conexion establecida			*/
		protected $conexion		= Null;
		/* base de datos activa			*/
		protected $dbActive		= False;

		public function __construct($nombre = False) {
			/* enviamos el constructor del padre */
			parent::__construct($nombre);
			/* por defecto asignamos localhost para la conexion */
			$this->hostMySql = 'localhost';
		}

		public function __destruct() {
			/* verificamos si existe una conexion */
			if ($this->isConected())
				/* desconectamos de la DB */
				$this->desconectar();
			/* enviamos el destructor padre */
			parent::__destruct();
		}

		public final function setUser($user = False) {
			try {
				/* guardamos el usuario */
				$this->userMySql = $user;
				/* mostramos un mensaje para identificar que estamos haciendo */
				$this->show('Asignando el usuario ' . $this->italic($this->getUser()) . '..', False);
				/* verificamos que alla ingresado un usuario */
				if ($this->getUser() === False)
					/* si no ingreso un usuario enviamos un error */
					$this->newException('No se especifico un usuario');
				/* verificamos si ya esta conectado */
				if ($this->isConected())
					/* si esta conectado, enviamos un mensaje de error */
					$this->newException('El usuario no se puede modificar. Ya existe una conexion activa');
				/* mostramos el OK al mensaje */
				$this->showOK();
			} catch (MyException $e) {
				$this->show($e->getMensaje($this->html));
			}
		}

		public final function setPass($pass = False) {
			try {
				/* guardamos la contrasena */
				$this->passMySql = $pass;
				/* mostramos un mensaje para identificar que estamos haciendo */
				$this->show('Asignando la contrasena ' . $this->italic($this->getPass()) . '..', False);
				/* verificamos que alla ingresado una contrasena */
				if ($this->getPass() === False)
					/* sino ingreso una contrasena enviamos un error */
					$this->newException('No se especifico una contrasena');
				/* verificamos si esta conectado */
				if ($this->isConected())
					/* si esta conectado enviamos un mensaje de error */
					$this->newException('La contrasena no se puede modificar. Ya existe una conexion activa');
				/* mostramos el OK al mensaje */
				$this->showOK();
			} catch (MyException $e) {
				$this->show($e->getMensaje($this->html));
			}
		}

		public final function setHost($host = False) {
			try {
				/* guardamos el host */
				$this->hostMySql = $host;
				/* mostramos un mensaje para identificar que estamos haciendo */
				$this->show('Asignando el host ' . $this->italic($this->getHost()) . '..', False);
				/* verificamos que alla ingresado un host */
				if ($this->getHost() === False)
					/* enviamos un error si no expecifico el host */
					$this->newException('No se especifico un host');
				/* verificamos si esta conectado */
				if ($this->isConected())
					/* enviamos un mensaje de error si esta conectado */
					$this->newException('El host no se puede modificar. Ya existe una conexion activa');
				/* mostramos el OK al mensaje */
				$this->showOK();
			} catch (MyException $e) {
				$this->show($e->getMensaje($this->html));
			}
		}

		public final function setDB($db = False) {
			try {
				/* guardamos el host */
				$this->ddbbMySql = $db;
				/* mostramos un mensaje para identificar que estamos haciendo */
				$this->show('Asignando la Base de Datos ' . $this->italic($this->getDB()) . '..', False);
				/* verificamos si ingreso una DB */
				if ($this->getDB() === False)
					/* si no expecifico el nombre de la DB enviamos un mensaje de error */
					$this->newException('No se especifico una Base de Datos');
				/* mostramos el OK al mensaje */
				$this->showOK();
			} catch (MyException $e) {
				$this->show($e->getMensaje($this->html));
			}
		}

		public final function conectar() {
			try {
				/* verificamos que esten todos los datos para la conexion */
				$this->verificarDatos();
				/* conectamos a la DB */
				$this->conectToHost();
			} catch (MyException $e) {
				$this->show($e->getMensaje($this->html));
			}
		}

		public final function desconectar() {
			try {
				/* mostramos un mensaje para identificar que estamos haciendo */
				$this->show('Desconectando del host ' . $this->italic($this->getHost()) . ' ..', False);
				/* verificamos si esta conectado */
				$this->verificarConexion();
				/* cerramos la conexion */
				mysql_close($this->getLink());
				/* vaciamos la conexion */
				$this->conexion = Null;
				/* mostramos el OK al mensaje */
				$this->showOK();
			} catch (MyException $e) {
				$this->show($e->getMensaje($this->html));
			} catch (ErrorException $e) {
				echo $e;
			}
		}

		public final function seleccionarDB($db = False) {
			try {
				/* guardamos el valor */
				$this->ddbbMySql = ($db ? $db : $this->getDB());
				/* mostramos un mensaje para identificar que estamos haciendo */
				$this->show('Seleccionando la Base de Datos ' . $this->italic($this->getDB()) . '..', False);
				/* verificamos el parametro de una db */
				if ($this->getDB() === False)
					/* si no especifico una DB mostramos un error */
					$this->newException('No se especifico una Base de Datos para seleccionar');
				/* verificamos si esta conectado */
				$this->verificarConexion();
				/* intentamos conectar con la DB */
				$this->selectDB();
				/* mostramos el OK al mensaje */
				$this->showOK();
			} catch (MyException $e) {
				$this->show($e->getMensaje($this->html));
			}
		}

		protected final function getUser() {
			/* retornamos el usuario */
			return ($this->userMySql == '' ? False : $this->userMySql);
		}

		protected final function getPass() {
			/* retornamos la contresena */
			return ($this->passMySql == '' ? False : $this->passMySql);
		}

		protected final function getHost() {
			/* retornamos el host */
			return ($this->hostMySql == '' ? False : $this->hostMySql);
		}

		protected final function getDB() {
			/* retornamos el host */
			return ($this->ddbbMySql == '' ? False : $this->ddbbMySql);
		}

		protected final function isDBSelected() {
			/* retorna un booleano identificador de la DB seleccionada */
			return $this->dbActive;
		}

		protected final function getLink() {
			/* retorna el link de la conexion */
			return $this->conexion;
		}

		protected final function isConected() {
			/* verificamos el estado de la conexion */
			return (
				/* si la conexion es nula */
				strtolower(gettype($this->getLink())) == 'null' ?
				/* no hay una conexion, retornamos FALSE */
				False :
				/* sino, retornamos TRUE porque existe una conexion */
				True
			);
		}

		protected final function verificarDatos() {
			$error = False;
			/* mostramos un mensaje para identificar que estamos haciendo */
			$this->show('Verificando datos de conexion..', False);
			/* verificamos el host */
			if (!$this->getHost())
				$error = 'Falta el nombre del host';
			/* verificamos el usuario */
			elseif (!$this->getUser())
				$error = 'Falta el nombre de usuario';
			/* verificamos la contrasena */
			elseif (!$this->getPass())
				$error = 'Falta la contrasena';
			if ($error !== False)
				$this->newException("$error para la conexion");
			/* mostramos el OK al mensaje */
			$this->showOK();
		}

		protected final function conectToHost() {
			try {
				/* mostramos un mensaje para identificar que estamos haciendo */
				$this->show('Conectando con el host ' . $this->italic($this->getHost()) . '..', False);
				/* verificamos que no este ya conectado */
				if ($this->isConected())
					$this->newException('Ya existe una conexion activa');
				/* intentamos crear la conexion */
				$this->conexion = mysql_connect($this->getHost(), $this->getUser(), $this->getPass());
				/* mostramos el OK al mensaje */
				$this->showOK();
				/* si se asigno una DB manualmente ya la seleccionamos */
				if ($this->getDB())
					$this->seleccionarDB();
			} catch (ErrorException $error) {
				/* si no se pudo conectar devolvemos un error */
				$this->newException('No se pudo conectar al host ' . $this->getHost() . ': ' . mysql_error());
			}
		}

		protected final function selectDB() {
			$this->setError('No se pudo seleccionar la Base de Datos \'' . $this->getDB() . '\'. ');
			try {
				/* intentamos seleccionar la db */
				$this->dbActive = mysql_select_db($this->getDB(), $this->getLink());
				if (!$this->dbActive)
					/* si no se pudo seleccionar enviamos un error */
					$this->newException($this->getError(True) . mysql_error());
				$this->setError(False);
			} catch (ErrorException $error) {
				/* si no se pudo conectar devolvemos el error */
				$this->newException($this->getError(True) . mysql_error());
			}
		}

		protected final function verificarConexion() {
			try {
				/* verificamos si esta conectado al host */
				if (!$this->isConected())
					/* si no esta conectado retornamos un error */
					$this->newException('No existe una conexion abierta');
				if (!mysql_ping($this->getLink()))
					/* si la conexion caduco retornamos un error */
					$this->newException('La conexion con el host ' . $this->getHost() . ' ha caducado');
			} catch (ErrorException $e) {
				$this->newException('La conexion con el host ' . $this->getHost() . ' ha caducado');
			}
		}

		protected function showOK($withSQL = False) {
			/* mostramos la cadena */
			$this->show((
				/* si por parametros se habilito la salida del comando SQL */
				$withSQL ?
				/* lo mostramos */
				'(' . $this->italic($this->tempSQL) . ').. ' :
				/* sino no enviamos el SQL */
				''
			/* agregamos el OK al final */
			) . 'OK');
		}
	}
?>